{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Multi-target Regression"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.datasets import make_regression\n",
    "\n",
    "x, y = make_regression(\n",
    "    n_samples=500, n_features=8, n_informative=8, n_targets=3, noise=30.0\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((500, 8), (500, 3))"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x.shape, y.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Feature # 0</th>\n",
       "      <th>Feature # 1</th>\n",
       "      <th>Feature # 2</th>\n",
       "      <th>Feature # 3</th>\n",
       "      <th>Feature # 4</th>\n",
       "      <th>Feature # 5</th>\n",
       "      <th>Feature # 6</th>\n",
       "      <th>Feature # 7</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.985063</td>\n",
       "      <td>-0.234092</td>\n",
       "      <td>-0.548207</td>\n",
       "      <td>0.172758</td>\n",
       "      <td>-0.164783</td>\n",
       "      <td>1.576365</td>\n",
       "      <td>1.054323</td>\n",
       "      <td>0.384962</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.935437</td>\n",
       "      <td>0.256300</td>\n",
       "      <td>1.015394</td>\n",
       "      <td>0.679767</td>\n",
       "      <td>1.130335</td>\n",
       "      <td>-0.921582</td>\n",
       "      <td>-2.327100</td>\n",
       "      <td>-1.134328</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.587509</td>\n",
       "      <td>-0.613461</td>\n",
       "      <td>-0.831734</td>\n",
       "      <td>0.230124</td>\n",
       "      <td>0.478013</td>\n",
       "      <td>1.154532</td>\n",
       "      <td>-0.288030</td>\n",
       "      <td>0.554882</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-1.203131</td>\n",
       "      <td>0.384008</td>\n",
       "      <td>1.217668</td>\n",
       "      <td>-1.530389</td>\n",
       "      <td>-1.811354</td>\n",
       "      <td>0.232074</td>\n",
       "      <td>0.690616</td>\n",
       "      <td>-1.305875</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.982752</td>\n",
       "      <td>-0.063857</td>\n",
       "      <td>-0.210975</td>\n",
       "      <td>0.537989</td>\n",
       "      <td>-0.489671</td>\n",
       "      <td>-1.055574</td>\n",
       "      <td>1.114263</td>\n",
       "      <td>1.950719</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Feature # 0  Feature # 1  Feature # 2  Feature # 3  Feature # 4  \\\n",
       "0     0.985063    -0.234092    -0.548207     0.172758    -0.164783   \n",
       "1     0.935437     0.256300     1.015394     0.679767     1.130335   \n",
       "2     1.587509    -0.613461    -0.831734     0.230124     0.478013   \n",
       "3    -1.203131     0.384008     1.217668    -1.530389    -1.811354   \n",
       "4     0.982752    -0.063857    -0.210975     0.537989    -0.489671   \n",
       "\n",
       "   Feature # 5  Feature # 6  Feature # 7  \n",
       "0     1.576365     1.054323     0.384962  \n",
       "1    -0.921582    -2.327100    -1.134328  \n",
       "2     1.154532    -0.288030     0.554882  \n",
       "3     0.232074     0.690616    -1.305875  \n",
       "4    -1.055574     1.114263     1.950719  "
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "feature_names = [f'Feature # {i}' for i in range(x.shape[1])]\n",
    "\n",
    "dfx = pd.DataFrame(\n",
    "    x, columns=feature_names\n",
    ")\n",
    "\n",
    "dfx.head(5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Target # 0</th>\n",
       "      <th>Target # 1</th>\n",
       "      <th>Target # 2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>310.838108</td>\n",
       "      <td>74.799393</td>\n",
       "      <td>128.215418</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-221.952989</td>\n",
       "      <td>-13.383877</td>\n",
       "      <td>-27.150561</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>266.348992</td>\n",
       "      <td>46.170181</td>\n",
       "      <td>107.569697</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-258.546123</td>\n",
       "      <td>-9.963706</td>\n",
       "      <td>-39.545191</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>205.705567</td>\n",
       "      <td>65.084581</td>\n",
       "      <td>-28.292117</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Target # 0  Target # 1  Target # 2\n",
       "0  310.838108   74.799393  128.215418\n",
       "1 -221.952989  -13.383877  -27.150561\n",
       "2  266.348992   46.170181  107.569697\n",
       "3 -258.546123   -9.963706  -39.545191\n",
       "4  205.705567   65.084581  -28.292117"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "target_names = [f'Target # {i}' for i in range(y.shape[1])]\n",
    "\n",
    "dfy = pd.DataFrame(\n",
    "    y, columns=target_names\n",
    ")\n",
    "\n",
    "dfy.head(5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((375, 8), (375, 3), (125, 8), (125, 3))"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x_train.shape, y_train.shape, x_test.shape, y_test.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "ename": "ValueError",
     "evalue": "bad input shape (375, 3)",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mValueError\u001b[0m                                Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-7-94c98af23d7a>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      3\u001b[0m \u001b[0mrgr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mSGDRegressor\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mrgr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx_train\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_train\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      5\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      6\u001b[0m \u001b[0my_pred\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrgr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpredict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx_test\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/scikitbook/lib/python3.6/site-packages/sklearn/linear_model/_stochastic_gradient.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, X, y, coef_init, intercept_init, sample_weight)\u001b[0m\n\u001b[1;32m   1219\u001b[0m                          \u001b[0mcoef_init\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcoef_init\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1220\u001b[0m                          \u001b[0mintercept_init\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mintercept_init\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1221\u001b[0;31m                          sample_weight=sample_weight)\n\u001b[0m\u001b[1;32m   1222\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1223\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0m_decision_function\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mX\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/scikitbook/lib/python3.6/site-packages/sklearn/linear_model/_stochastic_gradient.py\u001b[0m in \u001b[0;36m_fit\u001b[0;34m(self, X, y, alpha, C, loss, learning_rate, coef_init, intercept_init, sample_weight)\u001b[0m\n\u001b[1;32m   1179\u001b[0m         self._partial_fit(X, y, alpha, C, loss, learning_rate,\n\u001b[1;32m   1180\u001b[0m                           \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmax_iter\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msample_weight\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcoef_init\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1181\u001b[0;31m                           intercept_init)\n\u001b[0m\u001b[1;32m   1182\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1183\u001b[0m         if (self.tol is not None and self.tol > -np.inf\n",
      "\u001b[0;32m~/anaconda3/envs/scikitbook/lib/python3.6/site-packages/sklearn/linear_model/_stochastic_gradient.py\u001b[0m in \u001b[0;36m_partial_fit\u001b[0;34m(self, X, y, alpha, C, loss, learning_rate, max_iter, sample_weight, coef_init, intercept_init)\u001b[0m\n\u001b[1;32m   1100\u001b[0m                      max_iter, sample_weight, coef_init, intercept_init):\n\u001b[1;32m   1101\u001b[0m         X, y = check_X_y(X, y, \"csr\", copy=False, order='C', dtype=np.float64,\n\u001b[0;32m-> 1102\u001b[0;31m                          accept_large_sparse=False)\n\u001b[0m\u001b[1;32m   1103\u001b[0m         \u001b[0my\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mastype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfloat64\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1104\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/scikitbook/lib/python3.6/site-packages/sklearn/utils/validation.py\u001b[0m in \u001b[0;36mcheck_X_y\u001b[0;34m(X, y, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, multi_output, ensure_min_samples, ensure_min_features, y_numeric, warn_on_dtype, estimator)\u001b[0m\n\u001b[1;32m    742\u001b[0m                         dtype=None)\n\u001b[1;32m    743\u001b[0m     \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 744\u001b[0;31m         \u001b[0my\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcolumn_or_1d\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mwarn\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    745\u001b[0m         \u001b[0m_assert_all_finite\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    746\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0my_numeric\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkind\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'O'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/scikitbook/lib/python3.6/site-packages/sklearn/utils/validation.py\u001b[0m in \u001b[0;36mcolumn_or_1d\u001b[0;34m(y, warn)\u001b[0m\n\u001b[1;32m    779\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mravel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    780\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 781\u001b[0;31m     \u001b[0;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"bad input shape {0}\"\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    782\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    783\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mValueError\u001b[0m: bad input shape (375, 3)"
     ]
    }
   ],
   "source": [
    "# This code will throw a `ValueError: bad input shape`\n",
    "# We will fix that in the next section\n",
    "\n",
    "from sklearn.linear_model import SGDRegressor\n",
    "\n",
    "rgr = SGDRegressor()\n",
    "rgr.fit(x_train, y_train)\n",
    "\n",
    "y_pred = rgr.predict(x_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## MultiOutput Regressor"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 549,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.multioutput import MultiOutputRegressor\n",
    "from sklearn.linear_model import SGDRegressor\n",
    "\n",
    "rgr = MultiOutputRegressor(\n",
    "    estimator=SGDRegressor(), \n",
    "    n_jobs=-1\n",
    ")\n",
    "rgr.fit(x_train, y_train)\n",
    "y_pred = rgr.predict(x_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 550,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Target # 0</th>\n",
       "      <th>Target # 1</th>\n",
       "      <th>Target # 2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>388.246760</td>\n",
       "      <td>265.861254</td>\n",
       "      <td>304.680191</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-14.613780</td>\n",
       "      <td>229.371666</td>\n",
       "      <td>-54.839709</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-99.291296</td>\n",
       "      <td>-137.406606</td>\n",
       "      <td>-78.830682</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>70.124828</td>\n",
       "      <td>102.777829</td>\n",
       "      <td>66.346197</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Target # 0  Target # 1  Target # 2\n",
       "0  388.246760  265.861254  304.680191\n",
       "1  -14.613780  229.371666  -54.839709\n",
       "2  -99.291296 -137.406606  -78.830682\n",
       "3   70.124828  102.777829   66.346197"
      ]
     },
     "execution_count": 550,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_pred = pd.DataFrame(\n",
    "    y_pred, columns=target_names\n",
    ")\n",
    "\n",
    "df_pred.head(4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 551,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Target # 0</th>\n",
       "      <th>Target # 1</th>\n",
       "      <th>Target # 2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>125.000000</td>\n",
       "      <td>125.000000</td>\n",
       "      <td>125.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>-6.321237</td>\n",
       "      <td>-2.894993</td>\n",
       "      <td>11.095910</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>138.403445</td>\n",
       "      <td>145.645776</td>\n",
       "      <td>175.687486</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>-453.102572</td>\n",
       "      <td>-438.465922</td>\n",
       "      <td>-448.537570</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>-104.854652</td>\n",
       "      <td>-90.421777</td>\n",
       "      <td>-88.148752</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>7.229997</td>\n",
       "      <td>-6.481535</td>\n",
       "      <td>20.461999</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>90.195058</td>\n",
       "      <td>106.442328</td>\n",
       "      <td>122.109468</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>388.246760</td>\n",
       "      <td>322.595498</td>\n",
       "      <td>380.896983</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       Target # 0  Target # 1  Target # 2\n",
       "count  125.000000  125.000000  125.000000\n",
       "mean    -6.321237   -2.894993   11.095910\n",
       "std    138.403445  145.645776  175.687486\n",
       "min   -453.102572 -438.465922 -448.537570\n",
       "25%   -104.854652  -90.421777  -88.148752\n",
       "50%      7.229997   -6.481535   20.461999\n",
       "75%     90.195058  106.442328  122.109468\n",
       "max    388.246760  322.595498  380.896983"
      ]
     },
     "execution_count": 551,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_pred.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 552,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/tarek/anaconda3/envs/scikitbook/lib/python3.6/site-packages/ipykernel_launcher.py:10: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n",
      "  # Remove the CWD from sys.path while we load stuff.\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA9gAAAHfCAYAAACrsHDgAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAfkklEQVR4nO3df5Tld13f8dfbLCiWdgZsDDSJJkemY4NagUqYoisHqMZoDZ7uQVqqQenpkQNTtXvqsOJ60KVnHTUCLlg4DQr0UNAzaJO2aSOoOHBcfoUfQoLjLEhKYojRMFMi2Lj66R/zTZjsj+xm5zO5c+88HufsYb7f+733vmfY/Wae9/u931uttQAAAABb82WjHgAAAAAmgcAGAACADgQ2AAAAdCCwAQAAoAOBDQAAAB0IbAAAAOhAYAPAGKqqS6qqVdW3nmp5C4/78qo61mdKANhdBDYAdFJVbxwit1XV8aq6tapeV1Vf9TA8/WeSPD7J+85m46r61mHOS0646ReTPK3vaACwO+wZ9QAAMGHeneS52fhv7FOSXJvk4iTffeKGVfXI1tq9PZ60tfY3ST7b4XHuSXLP1icCgN3HEWwA6Ove1tpnW2u3tdauS/KqJFdU1T8ajhg/v6puqKq/THIoSarqCVX19qpaq6rPVdVvV9U3bn7QqnpuVR2rqr+qqj9I8k0n3H7SKeJV9dVV9WtVdedwv5Wq+uHhqPW7h83+ZLjfu4b7nHSKeFVdXVW3VNW9VXVbVb2iqvZsuv1dVXVtVR2sqs9W1d1V9eaqevSmbZ5YVTcO3+NfVtUnquoHtvzTBoAdxBFsANheX8zGC9r3/Td3MclCkhcnSVVdkOQ9SX4rybcluTfJS5K8q6q+vrV2V1U9Kclbk/x8kjcmeWKSVz/Yk1bVo5L8/vD8z0/yqSRPSPLYbJxOflWS65I8dVg+5ZH0qvruJL+a5KeSvD3Jk5K8LklLcnDTpvuS/FqSZyT5miRvS3Lrpm3emuTjSf5pkr9KMpvkvAf7HgBg3AhsANgmVXVZNkL6fUk+P6x+fWvtLZu2eXmST7fWXrRp3b9LcmU2wvhVSfYneW9r7cCwyUpV/YMkRx7k6f9VkkuTPKG1dtuw7lObnuPu4cu7WmsPdmr5S5O8vbV2eFj+46p6XJKfq6pDm05xv7W19uPD139UVb+e5Nn5UmB/bZJfaq3dcuIsADApnCIOAH09o6ruqaovZuOI7aeyEbv3ef8J239LkqcM97mnqu7JRoxfkmRm2OayJH9wwv3ec4Y5npLklk1xfa6emGT5hHW/n+QrknzdpnUfPWGbP01ywablX0xy7XA6+cur6slbnAsAdhxHsAGgr/cluTrJ8SR/et8R3k1X6/7LE7b/siS/k43Twk+0vj0jbosTTzFv2fRCfmvtUFW9JckVSZ6Z5Cer6udbaz/1MM4IANvKEWwA6OuLrbVjrbVPn+UVwj+YjaPEtw332/znrmGbW7Lx3uXNnn6Gx70pyWVVddFpbr9vtjO9D/rmJHtPWPft2Xhv9yfPcN8HaK19qrX2K621fUl+OsmLznQfABgnAhsARus12Yjc66rq24argX9rVf3Hqrovql+ZZG5Y9w+r6vuy8b7sB/PWbFxk7PqqenZVXVpVz6qq7x9uvzXJ3ya5crja+NRpHudwkn9RVS8dnvu5SV6e5Jqz/Yixqnp0Vb22qp45zPGkbBzJvuVM9wWAcSKwAWCEWmt3JplL8udJfjPJSpK3ZOOiYHcM29yUjfdxPy/Jx7Jx4bEfP9XjbXrcL2TjSPPHs3FF708keW2SR2163gPDY92RjSuKn+pxbkjyw9k47f3j2Yj9X0nyMw/h2zye5DFJ3jDMcWOSO/PA96YDwNir1tqoZwAAAICx5wg2AAAAdCCwAQAAoAOBDQAAAB3syM/BXl9f98ZwAAAAdrSpqanavOwINgAAAHQgsAEAAKADgQ2D1dXVUY8AsG3s44BJZh/HTiGwAQAAoAOBDQAAAB0IbAAAAOhAYAMAAEAHAhsAAAA6ENgAAADQgcAGAACADgQ2AAAAdNAtsKvqvKr6cFX9j2H50qp6X1Udq6pfr6pHDuu/fFg+Ntx+Sa8ZAAAAYFR6HsH+0SSf2LS8mOSVrbUnJPlckhcO61+Y5HPD+lcO2wEAAMBY6xLYVXVRku9Ocu2wXEmemWRp2ORNSZ4zfH3VsJzh9mcN2wMAAMDY6nUE+1VJfiLJ3w7LX5VkrbV2fFi+LcmFw9cXJvlMkgy3rw/bAwAAwNjas9UHqKrvSfJnrbWbquoZWx/pgVZXV3s/JJyWv2/AJLOPAyaZfRwPl5mZmdPetuXATvL0JN9bVVcm+Yokfy/Jq5NMV9We4Sj1RUluH7a/PcnFSW6rqj1JppL8xbkMDz2trq76+wZMLPs4YJLZx7FTbPkU8dbagdbaRa21S5I8L8nvttaen+T3kuwbNrs6yXXD19cPyxlu/93WWtvqHHCulpaWMjc3l8svvzxzc3NZWlo6850AAABO0OMI9uksJHlbVb0iyYeTvGFY/4Yk/6WqjiW5OxtRDiOxtLSUQ4cO5ciRIzn//PNz1113ZX5+Pkmyb9++M9wbAADgS2onHjxeX1/feUMxkebm5rK4uJi9e/fef2rR8vJyFhYWcvTo0VGPB9CN0yeBSWYfx6hMTU094BOxen4ONoydlZWVzM3NPWDd3NxcVlZWRjQRAAAwrgQ2u9rs7OxJR6qPHj2a2dnZEU0EAACMK4HNrrZ///7Mz89neXk5x48fz/Lycubn57N///5RjwYAAIyZ7bzIGex4913IbGFhISsrK5mdnc3Bgwdd4AwAAHjIXOQMBi6OAUwy+zhglA4fPpzFxcVRj3FOFhYWcuDAgVGPwQ514kXOBDYM/PIJTDL7OGCSTU9PZ21tbdRjsAu5ijgAAABsA4ENAAAAHQhsAAAA6EBgAwAAQAcCGwAAADoQ2AAAANCBwAYAAIAOBDYAAAB0ILABAACgA4ENAAAAHQhsAAAA6EBgAwAAQAcCGwAAADoQ2AAAANCBwAYAAIAOBDYAAAB0ILABAACgA4ENAAAAHQhsAAAA6EBgAwAAQAcCGwAAADoQ2AAAANCBwAYAAIAOBDYAAAB0ILABAACggz2jHgAASA4fPpzFxcVRj3FOFhYWcuDAgVGPAQAjV621Uc9wkvX19Z03FBNvdXU1MzMzox4DYFtMT09nbW1t1GMAbAv7OEZlamqqNi87RRwAAAA6ENgAAADQgcAGAACADgQ2AAAAdCCwAQAAoAOBDQAAAB0IbAAAAOhAYAMAAEAHAhsAAAA6ENgAAADQgcAGAACADgQ2AAAAdCCwAQAAoAOBDQAAAB0IbAAAAOhAYAMAAEAHAhsAAAA6ENgAAADQwZ5RDwBn6/Dhw1lcXBz1GOdkYWEhBw4cGPUYAADANqrW2qhnOMn6+vrOG4qJNz09nbW1tVGPAbAt7OOASWYfx6hMTU3V5mWniAMAAEAHAhsAAAA6ENgAAADQgcAGAACADgQ2AAAAdCCwAQAAoAOBDQAAAB0IbAAAAOhAYAMAAEAHAhsAAAA6ENgAAADQgcAGAACADgQ2AAAAdCCwAQAAoAOBDQAAAB0IbAAAAOhAYAMAAEAHAhsAAAA6ENgAAADQgcAGAACADgQ2AAAAdCCwAQAAoAOBDQAAAB0IbAAAAOhAYAMAAEAHAhsAAAA6ENgAAADQgcAGAACADgQ2AAAAdCCwAQAAoAOBDQAAAB0IbAAAAOhgy4FdVRdX1e9V1S1VdXNV/eiw/rFV9Y6qWh3+9zHD+qqqX66qY1X1h1X15K3OAAAAAKPW4wj28ST7W2uXJXlakhdX1WVJXprkd1prM0l+Z1hOku9KMjP8+bdJ/lOHGQAAAGCkthzYrbU7WmsfGr7+fJJPJLkwyVVJ3jRs9qYkzxm+virJm9uG9yaZrqrHb3UOAAAAGKWu78GuqkuSPCnJ+5Jc0Fq7Y7jps0kuGL6+MMlnNt3ttmEdAAAAjK09vR6oqh6d5O1Jfqy19n+r6v7bWmutqtq5PO7q6mqnCeHM/H0DJpl9HDDJ7ON4uMzMzJz2ti6BXVWPyEZcv6W19pvD6jur6vGttTuGU8D/bFh/e5KLN939omHdKT3Y8NCbv2/AJLOPAyaZfRw7QY+riFeSNyT5RGvtlzbddH2Sq4evr05y3ab1PzhcTfxpSdY3nUoOAAAAY6nHEeynJ/mBJB+rqo8M634yyc8l+Y2qemGSW5M8d7jthiRXJjmW5AtJfqjDDAAAADBSWw7s1tp7ktRpbn7WKbZvSV681ecFAACAnaTrVcQBAABgtxLYAAAA0IHABgAAgA4ENgAAAHQgsAEAAKADgQ0AAAAdCGwAAADoQGADAABABwIbAAAAOhDYAAAA0IHABgAAgA4ENgAAAHQgsAEAAKADgQ0AAAAdCGwAAADoQGADAABABwIbAAAAOhDYAAAA0IHABgAAgA4ENgAAAHQgsAEAAKADgQ0AAAAdCGwAAADoQGADAABABwIbAAAAOhDYAAAA0IHABgAAgA4ENgAAAHQgsAEAAKADgQ0AAAAdCGwAAADoYM+oBwAAAEbvkksuydra2qjHOGfT09OjHuGcTE9P59Of/vSox6ATgQ0AAGRtbW1sA3t1dTUzMzOjHuOcjOsLA5yaU8QBAACgA4ENAAAAHQhsAAAA6EBgAwAAQAcCGwAAADoQ2AAAANCBj+kCgLPkM2JHw2fEAjAuBDYAnCWfETsa4/rCAAC7j1PEAQAAoAOBDQAAAB0IbAAAAOhAYAMAAEAHAhsAAAA6cBVxuvIRNqPhI2wAAGD0BDZd+Qib0RjXFwYAAGCSOEUcAAAAOhDYAAAA0IHABgAAgA4ENgAAAHQgsAEAAKADgQ0AAAAdCGwAAADoQGADAABABwIbAAAAOhDYAAAA0IHABgAAgA4ENgAAAHQgsAEAAKADgQ0AAAAdCGwAAADoQGADAABABwIbAAAAOhDYAAAA0IHABgAAgA4ENgAAAHQgsAEAAKADgQ0AAAAdCGwAAADoQGADAABABwIbAAAAOhDYAAAA0IHABgAAgA4ENgAAAHQgsAEAAKADgQ0AAAAdCGwAAADoYM+oBwAAAHaG6enpUY8AY01gAwAASZK1tbVRj3BOVldXMzMzM+oxzokXNSaLU8QBAACgA4ENAAAAHQhsAAAA6EBgAwAAQAcju8hZVV2R5NVJzktybWvt50Y1C325UAMAALAbjSSwq+q8JK9N8s+S3JbkA1V1fWvtllHMQ1+uPvnw86IGAACM3qhOEX9qkmOttU+11u5N8rYkV41oFgAAANiyUQX2hUk+s2n5tmEdAAAAjKWRvQf7bK2uro56BB6icf7/zOzAmYzzvzWzA2cyzv/WzM7D5cHeVjqqwL49ycWbli8a1p1kXN8Tu5uN6/9n4/we7GR8f+4wbsb135p9HHA2xvXfmn0cO8WoThH/QJKZqrq0qh6Z5HlJrh/RLAAAALBlIzmC3Vo7XlUvSXJjNj6m61dbazePYhYAeChctR8AOJ2RvQe7tXZDkhtG9fwAcC58FOHDz4saAIyLUZ0iDgAAABNFYAMAAEAHAhsAAAA6ENgAAADQgcAGAACADgQ2AAAAdCCwAQAAoAOBDQAAAB0IbAAAAOhAYAMAAEAHAhsAAAA6ENgAAADQgcAGAACADgQ2AAAAdCCwAQAAoAOBDQAAAB0IbAAAAOhAYAMAAEAHAhsAAAA6ENgAAADQgcAGAACADgQ2AAAAdCCwAQAAoAOBDQAAAB0IbAAAAOhAYAMAAEAHAhsAAAA6ENgAAADQgcAGAACADgQ2AAAAdCCwAQAAoAOBDQAAAB0IbAAAAOhAYAMAAEAHAhsAAAA6ENgAAADQwZ5RDwAAAOwM09PTox5h1/EznywCGwAeAr8IPfz8zOHhsba2NuoRztn09PRYz8/kENgAcJbG+Zc3v3wCwPbzHmwAAADoQGADAABABwIbAAAAOhDYAAAA0IHABgAAgA5cRZzufJzKw8/PHAAARk9g09U4fwSMj7ABAAC2winiAAAA0IHABgAAgA4ENgAAAHQgsAEAAKADgQ0AAAAdCGwAAADoQGADAABABwIbAAAAOhDYAAAA0IHABgAAgA4ENgAAAHQgsAEAAKADgQ0AAAAdCGwAAADoQGADAABABwIbAAAAOhDYAAAA0IHABgAAgA4ENgAAAHQgsAEAAKADgQ0AAAAdCGwAAADoQGADAABABwIbAAAAOhDYAAAA0IHABgAAgA4ENgAAAHQgsAEAAKADgQ0AAAAdCGwAAADoQGADAABABwIbAAAAOhDYAAAA0IHABgAAgA4ENgAAAHQgsAEAAKADgQ0AAAAdCGwAAADoQGADAABAB1sK7Kr6har6o6r6w6r6raqa3nTbgao6VlUrVfWdm9ZfMaw7VlUv3crzAwAAwE6x1SPY70jyDa21b0ryx0kOJElVXZbkeUmemOSKJL9SVedV1XlJXpvku5JcluRfDtsCAADAWNtSYLfWfru1dnxYfG+Si4avr0ryttba/2ut/UmSY0meOvw51lr7VGvt3iRvG7YFAACAsdbzPdg/nOR/DV9fmOQzm267bVh3uvUAAAAw1vacaYOqemeSx53ippe11q4btnlZkuNJ3tJ3vGR1dbX3Q8Jp+fsGTDL7OGCS2cfxcJmZmTntbWcM7Nbasx/s9qp6QZLvSfKs1lobVt+e5OJNm100rMuDrD+lBxseevP3DZhk9nHAJLOPYyfY6lXEr0jyE0m+t7X2hU03XZ/keVX15VV1aZKZJO9P8oEkM1V1aVU9MhsXQrt+KzMAAADATnDGI9hn8JokX57kHVWVJO9trf1Ia+3mqvqNJLdk49TxF7fW/iZJquolSW5Mcl6SX22t3bzFGQAAAGDk6ktnde8c6+vrO28oJt709HTW1tZGPQbAtrCPAyaZfRyjMjU1VZuXe15FHAAAAHYtgQ0AAAAdCGwAAADoQGADAABABwIbAAAAOhDYAAAA0IHABgAAgA4ENgAAAHQgsAEAAKADgQ0AAAAdCGwAAADoQGADAABABwIbAAAAOhDYAAAA0IHABgAAgA4ENgAAAHQgsAEAAKADgQ0AAAAdCGwAAADoQGADAABABwIbAAAAOhDYAAAA0IHABgAAgA4ENgAAAHQgsAEAAKADgQ0AAAAdCGwAAADoQGADAABABwIbAAAAOhDYAAAA0IHABgAAgA4ENgAAAHQgsAEAAKADgQ0AAAAdCGwAAADoQGADAABABwIbAAAAOhDYAAAA0IHABgAAgA4ENgAAAHQgsAEAAKADgQ0AAAAdCGwAAADoQGADAABABwIbAAAAOhDYAAAA0IHABgAAgA4ENgAAAHQgsAEAAKADgQ0AAAAdCGwAAADoQGADAABABwIbAAAAOhDYAAAA0IHABgAAgA4ENgAAAHQgsAEAAKADgQ0AAAAdCGwAAADoQGADAABABwIbAAAAOhDYAAAA0MGeUQ8AACSHDx/O4uLitj7H9PT0tjzuwsJCDhw4sC2PDQDjpFpro57hJOvr6ztvKCbe9PR01tbWRj0GwLZYXV3NzMzMqMcA2BZ+j2NUpqamavOyU8QBAACgA4ENAAAAHQhsAAAA6EBgAwAAQAcCGwAAADoQ2AAAANCBwAYAAIAOBDYAAAB0ILABAACgA4ENAAAAHQhsAAAA6GDPqAeAs3X48OEsLi5u63NMT09vy+MuLCzkwIED2/LYAADAzlCttVHPcJL19fWdNxQTb3V1NTMzM6MeA2Bb2McBk2x6ejpra2ujHoNdaGpqqjYvO0UcAAAAOhDYAAAA0IHABgAAgA4ENgAAAHQgsAEAAKADgQ0AAAAdCGwAAADoQGADAABAB3t6PEhV7U/yi0nOb639eVVVklcnuTLJF5K8oLX2oWHbq5P81HDXV7TW3tRjBgAAYGc6fPhwFhcXt/U5pqent+VxFxYWcuDAgW15bCZPtda29gBVFye5NsnXJ3nKENhXJpnPRmBfnuTVrbXLq+qxST6Y5J8kaUluGu7zuc2Pub6+vrWh4Bysrq5mZmZm1GMAbAv7OGCS2ccxKlNTU7V5uccp4q9M8hPZCOb7XJXkzW3De5NMV9Xjk3xnkne01u4eovodSa7oMAMAAACM1JYCu6quSnJ7a+2jJ9x0YZLPbFq+bVh3uvUAAAAw1s74HuyqemeSx53ippcl+ckk39F7qM1WV1e38+HhAfx9AyaZfRwwyezjeLg82NsRzhjYrbVnn2p9VX1jkkuTfHTjmma5KMmHquqpSW5PcvGmzS8a1t2e5BknrH/XuQ4PPXnvDjDJ7OOASWYfx05xzqeIt9Y+1lr76tbaJa21S7JxuveTW2ufTXJ9kh+sDU9Lst5auyPJjUm+o6oeU1WPycbR7xu3/m0AAAC7zdLSUubm5nL55Zdnbm4uS0tLox6JXa7Lx3Sdwg3ZuIL4sWx8TNcPJUlr7e6qOpTkA8N2P9tau3ubZgAAACbU0tJSDh06lCNHjuT888/PXXfdlfn5+STJvn37Rjwdu9WWP6ZrO/iYLkbBqUXAJLOPAybN3NxcFhcXs3fv3vv3ccvLy1lYWMjRo0dHPR67xHZ8TBcAAMDDamVlJXNzcw9YNzc3l5WVlRFNBAIbAAAYQ7OzsycdqT569GhmZ2dHNBEIbAAAYAzt378/8/PzWV5ezvHjx7O8vJz5+fns379/1KOxi23XRc4AAAC2zX0XMltYWMjKykpmZ2dz8OBBFzhjpAQ2AAAwlvbt25d9+/a5kCM7hlPEAQAAoAOBDQAAAB0IbAAAAOhAYAMAAEAHAhsAAAA6ENgAMMGWlpYyNzeXyy+/PHNzc1laWhr1SAAwsXxMFwBMqKWlpRw6dChHjhzJ+eefn7vuuivz8/NJ4nNiAWAbOIINABPqmmuuyZEjR7J3797s2bMne/fuzZEjR3LNNdeMejQAmEgCGwAm1MrKSubm5h6wbm5uLisrKyOaCAAmm8AGgAk1Ozubo0ePPmDd0aNHMzs7O6KJAPpynQl2Gu/BBoAJtX///szPz9//Huzl5eXMz8/n4MGDox4NYMtcZ4KdqFpro57hJOvr6ztvKCbe6upqZmZmRj0GQFdLS0u55pprsrKyktnZ2ezfv98vnsBEmJuby+LiYvbu3Xv/73HLy8tZWFg46ewd2C5TU1O1eVlgs+v55RPYDbyICEyaxz72sbnzzjvziEc84v593F//9V/nggsuyN133z3q8dglTgxsp4izqzm1CABgPN13nYm9e/fev851Jhg1FzljV/MRNgAA4+m+60wsLy/n+PHj919nYv/+/aMejV3MEWx2NR9hAwAwnu4723BhYeH+t/odPHjQWYiMlMBmV3NqEQDA+Nq3b1/27dvnOhPsGE4RZ1dzahEAANCLI9jsak4tAgAAehHY7HpOLQIAAHpwijgAAAB0ILABAACgA4ENAAAAHQhsAAAA6EBgAwAAQAcCGwAAADoQ2AAAANCBwAYAAIAOBDYAAAB0ILABAACgA4ENAAAAHQhsAAAA6EBgAwAAQAfVWhv1DCdZX1/feUMBAADAJlNTU7V52RFsAAAA6EBgAwAAQAc78hRxAAAAGDeOYAMAAEAHAhsAAAA6ENjsaFX1VVX1keHPZ6vq9k3Lj9ym53xyVV1xFtv9flU9sqpeU1Xfcpptvq6q3l9Vx6rqv1bVI/pPDIyrCdjH/WhVfbKqWlVN958WGGcTsI97W1WtVNXHq+raqtrTf2ImjcBmR2ut/UVr7Ztba9+c5HVJXnnfcmvt3jPdv6rOO4enfXKSB90xV9Wjk9w7zPCUJB86zaa/kOTnW2tPSPKFJC84h3mACTUB+7jlJM9Mcvs5zAFMuAnYx705ydcn+aYkU0l+6BzmYZcR2IytqvrvVXVTVd1cVf9mWLenqtaq6lVV9YdJnlpV3zu8+nhTVR2pqv82bPvoqnrjcIT5w1X1z6vqUUl+Osnzh1dX953ied+d5CNJvrGqPpbkiUluqqrvPGG785LsTfJbw6o3JXnONv04gAmz0/dxSdJa+3Br7dZt/DEAE2pM9nE3tA1/m+T9SS7ath8IE8NpDoyzq1trd1fVVyb5YFW9Pcnns/EK43Jr7ceG2/44ydOT/J8kv7Hp/j+d5H+31l5QVY9J8r5svEL5s0m+obX2Y6d60tbat1XVgSS3JLknybNbawdOsen5Sf68tfY3w/JtSS7c4vcM7B47fR8HsBVjs48bTmd/fpIXbeH7ZZdwBJtx9uNV9dEkR7PxiuLXDevvzZeOGl+WZKW1dmvb+Ey6t266/3ckeVlVfSTJ7yX5iiRfc5bP/eQkH83GjvyjW/ouAE7NPg6YZOO0j3t9kne21o6e5eOzizmCzViqqmdn4/Trp7XWvlhV78nGjjVJvtjO7gPeK8lzWmufPOGx9z7I8/5Ikh9JMjP8+dokd1TVla21Hzxh87uS/P2qOm84in1RvE8ROAtjso8DOCfjtI+rqkNJ/m6SF57FTOAINmNrKsndw075iUlOefXHbJz+M1tVF1dVJfn+TbfdmGT+voWqetLw5eezsSM9SWvtdUm+K8lvDxfsWG2tXXaqnfIQ1e9O8n3DqquTXHe23yCwq+34fRzAFozFPm4I8mck+dfD+7DhjAQ24+p/JvnKqrolySuy8b6bk7TWvpDkJUnemeSDSdaSrA83/0ySv1NVH6uqm5O8fFj/u0n+8XDBjJMujpHk25O8u6ouTfLJU9y+2X9IslBVx5I8Oskbz+7bA3a5sdjHVdW/r6rbkjwuyc1V9fqH8D0Cu9eO38cNF6t9TZLHJ3nvcNG0lz20b5PdqM7uDAwYX1X16NbaPcMrn69P8rHW2pFRzwXQg30cMMns4xg3jmCzG7xouADGLUkeleQ/j3gegJ7s44BJZh/HWHEEGwAAADpwBBsAAAA6ENgAAADQgcAGAACADgQ2AAAAdCCwAQAAoIP/D6gERg6MFZYsAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 1080x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(1, 1, figsize=(15, 8))\n",
    "\n",
    "df_pred.plot(\n",
    "    title='Predictions',\n",
    "    kind='box',\n",
    "    color='k',\n",
    "    ax=ax\n",
    ")\n",
    "\n",
    "fig.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 553,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Target # 0: MAE=14.70, R2=0.69\n",
      "Target # 1: MAE=31.19, R2=0.91\n",
      "Target # 2: MAE=14.35, R2=-0.05\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import mean_absolute_error\n",
    "from sklearn.metrics import r2_score\n",
    "\n",
    "for t in range(y_train.shape[1]):\n",
    "    print(\n",
    "        'Target # {}: MAE={:.2f}, R2={:.2f}'.format(\n",
    "            t,\n",
    "            mean_absolute_error(y_test[t], y_pred[t]),\n",
    "            r2_score(y_test[t], y_pred[t]),\n",
    "        )\n",
    "    )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Regressor Chain"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 554,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.multioutput import RegressorChain\n",
    "from sklearn.linear_model import Ridge\n",
    "\n",
    "rgr = RegressorChain(\n",
    "    base_estimator=Ridge(\n",
    "        alpha=1\n",
    "    ), \n",
    "    order=[0,1,2],\n",
    ")\n",
    "rgr.fit(x_train, y_train)\n",
    "y_pred = rgr.predict(x_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 555,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Target # 0</th>\n",
       "      <th>Target # 1</th>\n",
       "      <th>Target # 2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>387.104197</td>\n",
       "      <td>265.167365</td>\n",
       "      <td>303.593918</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-14.625026</td>\n",
       "      <td>228.614278</td>\n",
       "      <td>-54.647947</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-99.105470</td>\n",
       "      <td>-137.019174</td>\n",
       "      <td>-78.690924</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>69.916189</td>\n",
       "      <td>102.628805</td>\n",
       "      <td>66.052427</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-9.471532</td>\n",
       "      <td>-50.476765</td>\n",
       "      <td>-35.556791</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Target # 0  Target # 1  Target # 2\n",
       "0  387.104197  265.167365  303.593918\n",
       "1  -14.625026  228.614278  -54.647947\n",
       "2  -99.105470 -137.019174  -78.690924\n",
       "3   69.916189  102.628805   66.052427\n",
       "4   -9.471532  -50.476765  -35.556791"
      ]
     },
     "execution_count": 555,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_pred = pd.DataFrame(\n",
    "    y_pred, columns=[f'Target # {i}' for i in range(y.shape[1])]\n",
    ")\n",
    "\n",
    "df_pred.head(5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 556,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Target # 0</th>\n",
       "      <th>Target # 1</th>\n",
       "      <th>Target # 2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>125.000000</td>\n",
       "      <td>125.000000</td>\n",
       "      <td>125.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>-6.399924</td>\n",
       "      <td>-2.874063</td>\n",
       "      <td>10.938459</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>138.015465</td>\n",
       "      <td>145.252443</td>\n",
       "      <td>175.230760</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>-452.289156</td>\n",
       "      <td>-437.354509</td>\n",
       "      <td>-447.399992</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>-105.235770</td>\n",
       "      <td>-89.957469</td>\n",
       "      <td>-88.167254</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>7.067715</td>\n",
       "      <td>-6.434888</td>\n",
       "      <td>20.448758</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>90.005280</td>\n",
       "      <td>105.966721</td>\n",
       "      <td>121.561737</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>387.104197</td>\n",
       "      <td>321.824953</td>\n",
       "      <td>379.912155</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       Target # 0  Target # 1  Target # 2\n",
       "count  125.000000  125.000000  125.000000\n",
       "mean    -6.399924   -2.874063   10.938459\n",
       "std    138.015465  145.252443  175.230760\n",
       "min   -452.289156 -437.354509 -447.399992\n",
       "25%   -105.235770  -89.957469  -88.167254\n",
       "50%      7.067715   -6.434888   20.448758\n",
       "75%     90.005280  105.966721  121.561737\n",
       "max    387.104197  321.824953  379.912155"
      ]
     },
     "execution_count": 556,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_pred.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 557,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Target # 0: MAE=14.80, R2=0.685697\n",
      "Target # 1: MAE=31.01, R2=0.908830\n",
      "Target # 2: MAE=14.23, R2=-0.027262\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import mean_absolute_error\n",
    "from sklearn.metrics import r2_score\n",
    "\n",
    "for t in range(y_train.shape[1]):\n",
    "    print(\n",
    "        'Target # {}: MAE={:.2f}, R2={:2f}'.format(\n",
    "            t,\n",
    "            mean_absolute_error(y_test[t], y_pred[t]),\n",
    "            r2_score(y_test[t], y_pred[t]),\n",
    "        )\n",
    "    )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 558,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Estimator for Target # 0:\n",
      "       Coeff      Feature\n",
      "0  79.918255  Feature # 0\n",
      "1  54.445405  Feature # 1\n",
      "2   8.751636  Feature # 2\n",
      "3  70.475604  Feature # 3\n",
      "4  55.110842  Feature # 4\n",
      "5  32.234095  Feature # 5\n",
      "6  10.481355  Feature # 6\n",
      "7  12.246104  Feature # 7\n",
      "\n",
      "Estimator for Target # 1:\n",
      "       Coeff      Feature\n",
      "0  39.483124  Feature # 0\n",
      "1  14.649653  Feature # 1\n",
      "2  15.149074  Feature # 2\n",
      "3  36.561750  Feature # 3\n",
      "4  92.613430  Feature # 4\n",
      "5  29.281277  Feature # 5\n",
      "6  56.292321  Feature # 6\n",
      "7  77.943212  Feature # 7\n",
      "8   0.037757   Target # 0\n",
      "\n",
      "Estimator for Target # 2:\n",
      "       Coeff      Feature\n",
      "0  70.360386  Feature # 0\n",
      "1   1.835239  Feature # 1\n",
      "2  92.844093  Feature # 2\n",
      "3  89.221276  Feature # 3\n",
      "4  41.716647  Feature # 4\n",
      "5  70.822408  Feature # 5\n",
      "6  27.621890  Feature # 6\n",
      "7  14.965828  Feature # 7\n",
      "8   0.090121   Target # 0\n",
      "9  -0.026836   Target # 1\n"
     ]
    }
   ],
   "source": [
    "for t, estimator in enumerate(rgr.estimators_):\n",
    "    print(f'\\nEstimator for Target # {t}:')\n",
    "    df_coef = pd.DataFrame(\n",
    "        zip(\n",
    "            rgr.estimators_[t].coef_, \n",
    "            feature_names + target_names\n",
    "        ),\n",
    "        columns=['Coeff', 'Feature']\n",
    "    )\n",
    "    print(df_coef)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 559,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style  type=\"text/css\" >\n",
       "    #T_863e48d8_612c_11ea_acd4_784f43517922row0_col1 {\n",
       "            width:  10em;\n",
       "             height:  80%;\n",
       "            background:  linear-gradient(90deg,#AAAAAA 100.0%, transparent 100.0%);\n",
       "        }    #T_863e48d8_612c_11ea_acd4_784f43517922row1_col1 {\n",
       "            width:  10em;\n",
       "             height:  80%;\n",
       "            background:  linear-gradient(90deg,#AAAAAA 68.1%, transparent 68.1%);\n",
       "        }    #T_863e48d8_612c_11ea_acd4_784f43517922row2_col1 {\n",
       "            width:  10em;\n",
       "             height:  80%;\n",
       "            background:  linear-gradient(90deg,#AAAAAA 11.0%, transparent 11.0%);\n",
       "        }    #T_863e48d8_612c_11ea_acd4_784f43517922row3_col1 {\n",
       "            width:  10em;\n",
       "             height:  80%;\n",
       "            background:  linear-gradient(90deg,#AAAAAA 88.2%, transparent 88.2%);\n",
       "        }    #T_863e48d8_612c_11ea_acd4_784f43517922row4_col1 {\n",
       "            width:  10em;\n",
       "             height:  80%;\n",
       "            background:  linear-gradient(90deg,#AAAAAA 69.0%, transparent 69.0%);\n",
       "        }    #T_863e48d8_612c_11ea_acd4_784f43517922row5_col1 {\n",
       "            width:  10em;\n",
       "             height:  80%;\n",
       "            background:  linear-gradient(90deg,#AAAAAA 40.3%, transparent 40.3%);\n",
       "        }    #T_863e48d8_612c_11ea_acd4_784f43517922row6_col1 {\n",
       "            width:  10em;\n",
       "             height:  80%;\n",
       "            background:  linear-gradient(90deg,#AAAAAA 13.1%, transparent 13.1%);\n",
       "        }    #T_863e48d8_612c_11ea_acd4_784f43517922row7_col1 {\n",
       "            width:  10em;\n",
       "             height:  80%;\n",
       "            background:  linear-gradient(90deg,#AAAAAA 15.3%, transparent 15.3%);\n",
       "        }</style><table id=\"T_863e48d8_612c_11ea_acd4_784f43517922\" ><thead>    <tr>        <th class=\"blank level0\" ></th>        <th class=\"col_heading level0 col0\" >Feature</th>        <th class=\"col_heading level0 col1\" >Coeff</th>    </tr></thead><tbody>\n",
       "                <tr>\n",
       "                        <th id=\"T_863e48d8_612c_11ea_acd4_784f43517922level0_row0\" class=\"row_heading level0 row0\" >0</th>\n",
       "                        <td id=\"T_863e48d8_612c_11ea_acd4_784f43517922row0_col0\" class=\"data row0 col0\" >Feature # 0</td>\n",
       "                        <td id=\"T_863e48d8_612c_11ea_acd4_784f43517922row0_col1\" class=\"data row0 col1\" >79.9183</td>\n",
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_863e48d8_612c_11ea_acd4_784f43517922level0_row1\" class=\"row_heading level0 row1\" >1</th>\n",
       "                        <td id=\"T_863e48d8_612c_11ea_acd4_784f43517922row1_col0\" class=\"data row1 col0\" >Feature # 1</td>\n",
       "                        <td id=\"T_863e48d8_612c_11ea_acd4_784f43517922row1_col1\" class=\"data row1 col1\" >54.4454</td>\n",
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_863e48d8_612c_11ea_acd4_784f43517922level0_row2\" class=\"row_heading level0 row2\" >2</th>\n",
       "                        <td id=\"T_863e48d8_612c_11ea_acd4_784f43517922row2_col0\" class=\"data row2 col0\" >Feature # 2</td>\n",
       "                        <td id=\"T_863e48d8_612c_11ea_acd4_784f43517922row2_col1\" class=\"data row2 col1\" >8.75164</td>\n",
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_863e48d8_612c_11ea_acd4_784f43517922level0_row3\" class=\"row_heading level0 row3\" >3</th>\n",
       "                        <td id=\"T_863e48d8_612c_11ea_acd4_784f43517922row3_col0\" class=\"data row3 col0\" >Feature # 3</td>\n",
       "                        <td id=\"T_863e48d8_612c_11ea_acd4_784f43517922row3_col1\" class=\"data row3 col1\" >70.4756</td>\n",
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_863e48d8_612c_11ea_acd4_784f43517922level0_row4\" class=\"row_heading level0 row4\" >4</th>\n",
       "                        <td id=\"T_863e48d8_612c_11ea_acd4_784f43517922row4_col0\" class=\"data row4 col0\" >Feature # 4</td>\n",
       "                        <td id=\"T_863e48d8_612c_11ea_acd4_784f43517922row4_col1\" class=\"data row4 col1\" >55.1108</td>\n",
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_863e48d8_612c_11ea_acd4_784f43517922level0_row5\" class=\"row_heading level0 row5\" >5</th>\n",
       "                        <td id=\"T_863e48d8_612c_11ea_acd4_784f43517922row5_col0\" class=\"data row5 col0\" >Feature # 5</td>\n",
       "                        <td id=\"T_863e48d8_612c_11ea_acd4_784f43517922row5_col1\" class=\"data row5 col1\" >32.2341</td>\n",
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_863e48d8_612c_11ea_acd4_784f43517922level0_row6\" class=\"row_heading level0 row6\" >6</th>\n",
       "                        <td id=\"T_863e48d8_612c_11ea_acd4_784f43517922row6_col0\" class=\"data row6 col0\" >Feature # 6</td>\n",
       "                        <td id=\"T_863e48d8_612c_11ea_acd4_784f43517922row6_col1\" class=\"data row6 col1\" >10.4814</td>\n",
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_863e48d8_612c_11ea_acd4_784f43517922level0_row7\" class=\"row_heading level0 row7\" >7</th>\n",
       "                        <td id=\"T_863e48d8_612c_11ea_acd4_784f43517922row7_col0\" class=\"data row7 col0\" >Feature # 7</td>\n",
       "                        <td id=\"T_863e48d8_612c_11ea_acd4_784f43517922row7_col1\" class=\"data row7 col1\" >12.2461</td>\n",
       "            </tr>\n",
       "    </tbody></table>"
      ],
      "text/plain": [
       "<pandas.io.formats.style.Styler at 0x1a1a786a58>"
      ]
     },
     "execution_count": 559,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.DataFrame(\n",
    "    zip(\n",
    "        rgr.estimators_[0].coef_, \n",
    "        feature_names + target_names\n",
    "    ),\n",
    "    columns=['Coeff', 'Feature']\n",
    ")[\n",
    "    ['Feature', 'Coeff']\n",
    "].style.bar(\n",
    "    subset=['Coeff'], align='mid', color='#AAAAAA'\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 560,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style  type=\"text/css\" >\n",
       "    #T_865c83d4_612c_11ea_b773_784f43517922row0_col1 {\n",
       "            width:  10em;\n",
       "             height:  80%;\n",
       "            background:  linear-gradient(90deg, transparent 0.0%, #AAAAAA 0.0%, #AAAAAA 75.8%, transparent 75.8%);\n",
       "        }    #T_865c83d4_612c_11ea_b773_784f43517922row1_col1 {\n",
       "            width:  10em;\n",
       "             height:  80%;\n",
       "            background:  linear-gradient(90deg, transparent 0.0%, #AAAAAA 0.0%, #AAAAAA 2.0%, transparent 2.0%);\n",
       "        }    #T_865c83d4_612c_11ea_b773_784f43517922row2_col1 {\n",
       "            width:  10em;\n",
       "             height:  80%;\n",
       "            background:  linear-gradient(90deg, transparent 0.0%, #AAAAAA 0.0%, #AAAAAA 100.0%, transparent 100.0%);\n",
       "        }    #T_865c83d4_612c_11ea_b773_784f43517922row3_col1 {\n",
       "            width:  10em;\n",
       "             height:  80%;\n",
       "            background:  linear-gradient(90deg, transparent 0.0%, #AAAAAA 0.0%, #AAAAAA 96.1%, transparent 96.1%);\n",
       "        }    #T_865c83d4_612c_11ea_b773_784f43517922row4_col1 {\n",
       "            width:  10em;\n",
       "             height:  80%;\n",
       "            background:  linear-gradient(90deg, transparent 0.0%, #AAAAAA 0.0%, #AAAAAA 44.9%, transparent 44.9%);\n",
       "        }    #T_865c83d4_612c_11ea_b773_784f43517922row5_col1 {\n",
       "            width:  10em;\n",
       "             height:  80%;\n",
       "            background:  linear-gradient(90deg, transparent 0.0%, #AAAAAA 0.0%, #AAAAAA 76.3%, transparent 76.3%);\n",
       "        }    #T_865c83d4_612c_11ea_b773_784f43517922row6_col1 {\n",
       "            width:  10em;\n",
       "             height:  80%;\n",
       "            background:  linear-gradient(90deg, transparent 0.0%, #AAAAAA 0.0%, #AAAAAA 29.8%, transparent 29.8%);\n",
       "        }    #T_865c83d4_612c_11ea_b773_784f43517922row7_col1 {\n",
       "            width:  10em;\n",
       "             height:  80%;\n",
       "            background:  linear-gradient(90deg, transparent 0.0%, #AAAAAA 0.0%, #AAAAAA 16.1%, transparent 16.1%);\n",
       "        }    #T_865c83d4_612c_11ea_b773_784f43517922row8_col1 {\n",
       "            width:  10em;\n",
       "             height:  80%;\n",
       "            background:  linear-gradient(90deg, transparent 0.0%, #AAAAAA 0.0%, #AAAAAA 0.1%, transparent 0.1%);\n",
       "        }    #T_865c83d4_612c_11ea_b773_784f43517922row9_col1 {\n",
       "            width:  10em;\n",
       "             height:  80%;\n",
       "            background:  linear-gradient(90deg,#AAAAAA 0.0%, transparent 0.0%);\n",
       "        }</style><table id=\"T_865c83d4_612c_11ea_b773_784f43517922\" ><thead>    <tr>        <th class=\"blank level0\" ></th>        <th class=\"col_heading level0 col0\" >Feature</th>        <th class=\"col_heading level0 col1\" >Coeff</th>    </tr></thead><tbody>\n",
       "                <tr>\n",
       "                        <th id=\"T_865c83d4_612c_11ea_b773_784f43517922level0_row0\" class=\"row_heading level0 row0\" >0</th>\n",
       "                        <td id=\"T_865c83d4_612c_11ea_b773_784f43517922row0_col0\" class=\"data row0 col0\" >Feature # 0</td>\n",
       "                        <td id=\"T_865c83d4_612c_11ea_b773_784f43517922row0_col1\" class=\"data row0 col1\" >70.3604</td>\n",
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_865c83d4_612c_11ea_b773_784f43517922level0_row1\" class=\"row_heading level0 row1\" >1</th>\n",
       "                        <td id=\"T_865c83d4_612c_11ea_b773_784f43517922row1_col0\" class=\"data row1 col0\" >Feature # 1</td>\n",
       "                        <td id=\"T_865c83d4_612c_11ea_b773_784f43517922row1_col1\" class=\"data row1 col1\" >1.83524</td>\n",
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_865c83d4_612c_11ea_b773_784f43517922level0_row2\" class=\"row_heading level0 row2\" >2</th>\n",
       "                        <td id=\"T_865c83d4_612c_11ea_b773_784f43517922row2_col0\" class=\"data row2 col0\" >Feature # 2</td>\n",
       "                        <td id=\"T_865c83d4_612c_11ea_b773_784f43517922row2_col1\" class=\"data row2 col1\" >92.8441</td>\n",
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_865c83d4_612c_11ea_b773_784f43517922level0_row3\" class=\"row_heading level0 row3\" >3</th>\n",
       "                        <td id=\"T_865c83d4_612c_11ea_b773_784f43517922row3_col0\" class=\"data row3 col0\" >Feature # 3</td>\n",
       "                        <td id=\"T_865c83d4_612c_11ea_b773_784f43517922row3_col1\" class=\"data row3 col1\" >89.2213</td>\n",
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_865c83d4_612c_11ea_b773_784f43517922level0_row4\" class=\"row_heading level0 row4\" >4</th>\n",
       "                        <td id=\"T_865c83d4_612c_11ea_b773_784f43517922row4_col0\" class=\"data row4 col0\" >Feature # 4</td>\n",
       "                        <td id=\"T_865c83d4_612c_11ea_b773_784f43517922row4_col1\" class=\"data row4 col1\" >41.7166</td>\n",
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_865c83d4_612c_11ea_b773_784f43517922level0_row5\" class=\"row_heading level0 row5\" >5</th>\n",
       "                        <td id=\"T_865c83d4_612c_11ea_b773_784f43517922row5_col0\" class=\"data row5 col0\" >Feature # 5</td>\n",
       "                        <td id=\"T_865c83d4_612c_11ea_b773_784f43517922row5_col1\" class=\"data row5 col1\" >70.8224</td>\n",
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_865c83d4_612c_11ea_b773_784f43517922level0_row6\" class=\"row_heading level0 row6\" >6</th>\n",
       "                        <td id=\"T_865c83d4_612c_11ea_b773_784f43517922row6_col0\" class=\"data row6 col0\" >Feature # 6</td>\n",
       "                        <td id=\"T_865c83d4_612c_11ea_b773_784f43517922row6_col1\" class=\"data row6 col1\" >27.6219</td>\n",
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_865c83d4_612c_11ea_b773_784f43517922level0_row7\" class=\"row_heading level0 row7\" >7</th>\n",
       "                        <td id=\"T_865c83d4_612c_11ea_b773_784f43517922row7_col0\" class=\"data row7 col0\" >Feature # 7</td>\n",
       "                        <td id=\"T_865c83d4_612c_11ea_b773_784f43517922row7_col1\" class=\"data row7 col1\" >14.9658</td>\n",
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_865c83d4_612c_11ea_b773_784f43517922level0_row8\" class=\"row_heading level0 row8\" >8</th>\n",
       "                        <td id=\"T_865c83d4_612c_11ea_b773_784f43517922row8_col0\" class=\"data row8 col0\" >Target # 0</td>\n",
       "                        <td id=\"T_865c83d4_612c_11ea_b773_784f43517922row8_col1\" class=\"data row8 col1\" >0.0901208</td>\n",
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_865c83d4_612c_11ea_b773_784f43517922level0_row9\" class=\"row_heading level0 row9\" >9</th>\n",
       "                        <td id=\"T_865c83d4_612c_11ea_b773_784f43517922row9_col0\" class=\"data row9 col0\" >Target # 1</td>\n",
       "                        <td id=\"T_865c83d4_612c_11ea_b773_784f43517922row9_col1\" class=\"data row9 col1\" >-0.0268364</td>\n",
       "            </tr>\n",
       "    </tbody></table>"
      ],
      "text/plain": [
       "<pandas.io.formats.style.Styler at 0x1a1a786b38>"
      ]
     },
     "execution_count": 560,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.DataFrame(\n",
    "    zip(\n",
    "        rgr.estimators_[-1].coef_, \n",
    "        feature_names + target_names\n",
    "    ),\n",
    "    columns=['Coeff', 'Feature']\n",
    ")[\n",
    "    ['Feature', 'Coeff']\n",
    "].style.bar(\n",
    "    subset=['Coeff'], align='mid', color='#AAAAAA'\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Multi-target Regression\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Multiclass classification:** classification task with more than two classes. Each sample can only be labelled as one class. For example, classification using features extracted from a set of images of fruit, where each image may either be of an orange, an apple, or a pear. Each image is one sample and is labelled as one of the 3 possible classes. \n",
    "\n",
    "**Multilabel classification:** classification task labelling each sample with x labels from n_classes. For example, prediction of the topics relevant to a text document or video. The document or video may be about one of ‘religion’, ‘politics’, ‘finance’ or ‘education’, several of the topic classes or all of the topic classes."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 592,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.datasets import make_multilabel_classification\n",
    "\n",
    "x, y = make_multilabel_classification(\n",
    "    n_samples=500, n_features=8, n_classes=3, n_labels=2\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 593,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((500, 8), (500, 3))"
      ]
     },
     "execution_count": 593,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x.shape, y.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 596,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 1])"
      ]
     },
     "execution_count": 596,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.unique(y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 597,
   "metadata": {},
   "outputs": [],
   "source": [
    "y[:,-1] = y[:,0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 598,
   "metadata": {},
   "outputs": [],
   "source": [
    "feature_names = [f'Feature # {i}' for i in range(x.shape[1])]\n",
    "target_names = [f'Target # {i}' for i in range(y.shape[1])]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 599,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 600,
   "metadata": {},
   "outputs": [
    {
     "ename": "ValueError",
     "evalue": "bad input shape (375, 3)",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mValueError\u001b[0m                                Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-600-812cf83af533>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      3\u001b[0m \u001b[0mclf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mGradientBoostingClassifier\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mclf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx_train\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_train\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      5\u001b[0m \u001b[0my_pred\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mclf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpredict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx_test\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/scikitbook/lib/python3.6/site-packages/sklearn/ensemble/_gb.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, X, y, sample_weight, monitor)\u001b[0m\n\u001b[1;32m   1452\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1453\u001b[0m         \u001b[0my\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcheck_array\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maccept_sparse\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'csc'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mensure_2d\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1454\u001b[0;31m         \u001b[0my\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcolumn_or_1d\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mwarn\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1455\u001b[0m         \u001b[0my\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_validate_y\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msample_weight\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1456\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/scikitbook/lib/python3.6/site-packages/sklearn/utils/validation.py\u001b[0m in \u001b[0;36mcolumn_or_1d\u001b[0;34m(y, warn)\u001b[0m\n\u001b[1;32m    779\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mravel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    780\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 781\u001b[0;31m     \u001b[0;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"bad input shape {0}\"\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    782\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    783\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mValueError\u001b[0m: bad input shape (375, 3)"
     ]
    }
   ],
   "source": [
    "from sklearn.ensemble import GradientBoostingClassifier\n",
    "\n",
    "clf = GradientBoostingClassifier()\n",
    "clf.fit(x_train, y_train)\n",
    "y_pred = clf.predict(x_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 602,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.multioutput import MultiOutputClassifier\n",
    "from sklearn.ensemble import GradientBoostingClassifier\n",
    "\n",
    "clf = MultiOutputClassifier(\n",
    "    estimator=GradientBoostingClassifier(\n",
    "        n_estimators=500,\n",
    "        learning_rate=0.01,\n",
    "        subsample=0.8,\n",
    "    ),\n",
    "    n_jobs=-1\n",
    ")\n",
    "clf.fit(x_train, y_train)\n",
    "y_pred_multioutput = clf.predict(x_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 603,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.multioutput import ClassifierChain\n",
    "from sklearn.ensemble import GradientBoostingClassifier\n",
    "\n",
    "clf = ClassifierChain(\n",
    "    base_estimator=GradientBoostingClassifier(\n",
    "        n_estimators=500,\n",
    "        learning_rate=0.01,\n",
    "        subsample=0.8,\n",
    "    ),\n",
    "    order=[0,1,2]\n",
    ")\n",
    "clf.fit(x_train, y_train)\n",
    "y_pred_chain = clf.predict(x_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 604,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style  type=\"text/css\" >\n",
       "    #T_4a9e5dd2_6144_11ea_9e82_784f43517922row0_col1 {\n",
       "            width:  10em;\n",
       "             height:  80%;\n",
       "            background:  linear-gradient(90deg,#AAAAAA 22.3%, transparent 22.3%);\n",
       "        }    #T_4a9e5dd2_6144_11ea_9e82_784f43517922row1_col1 {\n",
       "            width:  10em;\n",
       "             height:  80%;\n",
       "            background:  linear-gradient(90deg,#AAAAAA 15.2%, transparent 15.2%);\n",
       "        }    #T_4a9e5dd2_6144_11ea_9e82_784f43517922row2_col1 {\n",
       "            width:  10em;\n",
       "             height:  80%;\n",
       "            background:  linear-gradient(90deg,#AAAAAA 39.0%, transparent 39.0%);\n",
       "        }    #T_4a9e5dd2_6144_11ea_9e82_784f43517922row3_col1 {\n",
       "            width:  10em;\n",
       "             height:  80%;\n",
       "            background:  linear-gradient(90deg,#AAAAAA 50.9%, transparent 50.9%);\n",
       "        }    #T_4a9e5dd2_6144_11ea_9e82_784f43517922row4_col1 {\n",
       "            width:  10em;\n",
       "             height:  80%;\n",
       "            background:  linear-gradient(90deg,#AAAAAA 15.7%, transparent 15.7%);\n",
       "        }    #T_4a9e5dd2_6144_11ea_9e82_784f43517922row5_col1 {\n",
       "            width:  10em;\n",
       "             height:  80%;\n",
       "            background:  linear-gradient(90deg,#AAAAAA 42.0%, transparent 42.0%);\n",
       "        }    #T_4a9e5dd2_6144_11ea_9e82_784f43517922row6_col1 {\n",
       "            width:  10em;\n",
       "             height:  80%;\n",
       "            background:  linear-gradient(90deg,#AAAAAA 22.5%, transparent 22.5%);\n",
       "        }    #T_4a9e5dd2_6144_11ea_9e82_784f43517922row7_col1 {\n",
       "            width:  10em;\n",
       "             height:  80%;\n",
       "            background:  linear-gradient(90deg,#AAAAAA 100.0%, transparent 100.0%);\n",
       "        }    #T_4a9e5dd2_6144_11ea_9e82_784f43517922row8_col1 {\n",
       "            width:  10em;\n",
       "             height:  80%;\n",
       "            background:  linear-gradient(90deg,#AAAAAA 41.8%, transparent 41.8%);\n",
       "        }</style><table id=\"T_4a9e5dd2_6144_11ea_9e82_784f43517922\" ><thead>    <tr>        <th class=\"blank level0\" ></th>        <th class=\"col_heading level0 col0\" >Feature</th>        <th class=\"col_heading level0 col1\" >Coeff</th>    </tr></thead><tbody>\n",
       "                <tr>\n",
       "                        <th id=\"T_4a9e5dd2_6144_11ea_9e82_784f43517922level0_row0\" class=\"row_heading level0 row0\" >0</th>\n",
       "                        <td id=\"T_4a9e5dd2_6144_11ea_9e82_784f43517922row0_col0\" class=\"data row0 col0\" >Feature # 0</td>\n",
       "                        <td id=\"T_4a9e5dd2_6144_11ea_9e82_784f43517922row0_col1\" class=\"data row0 col1\" >0.0637737</td>\n",
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_4a9e5dd2_6144_11ea_9e82_784f43517922level0_row1\" class=\"row_heading level0 row1\" >1</th>\n",
       "                        <td id=\"T_4a9e5dd2_6144_11ea_9e82_784f43517922row1_col0\" class=\"data row1 col0\" >Feature # 1</td>\n",
       "                        <td id=\"T_4a9e5dd2_6144_11ea_9e82_784f43517922row1_col1\" class=\"data row1 col1\" >0.043504</td>\n",
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_4a9e5dd2_6144_11ea_9e82_784f43517922level0_row2\" class=\"row_heading level0 row2\" >2</th>\n",
       "                        <td id=\"T_4a9e5dd2_6144_11ea_9e82_784f43517922row2_col0\" class=\"data row2 col0\" >Feature # 2</td>\n",
       "                        <td id=\"T_4a9e5dd2_6144_11ea_9e82_784f43517922row2_col1\" class=\"data row2 col1\" >0.111602</td>\n",
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_4a9e5dd2_6144_11ea_9e82_784f43517922level0_row3\" class=\"row_heading level0 row3\" >3</th>\n",
       "                        <td id=\"T_4a9e5dd2_6144_11ea_9e82_784f43517922row3_col0\" class=\"data row3 col0\" >Feature # 3</td>\n",
       "                        <td id=\"T_4a9e5dd2_6144_11ea_9e82_784f43517922row3_col1\" class=\"data row3 col1\" >0.145739</td>\n",
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_4a9e5dd2_6144_11ea_9e82_784f43517922level0_row4\" class=\"row_heading level0 row4\" >4</th>\n",
       "                        <td id=\"T_4a9e5dd2_6144_11ea_9e82_784f43517922row4_col0\" class=\"data row4 col0\" >Feature # 4</td>\n",
       "                        <td id=\"T_4a9e5dd2_6144_11ea_9e82_784f43517922row4_col1\" class=\"data row4 col1\" >0.044972</td>\n",
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_4a9e5dd2_6144_11ea_9e82_784f43517922level0_row5\" class=\"row_heading level0 row5\" >5</th>\n",
       "                        <td id=\"T_4a9e5dd2_6144_11ea_9e82_784f43517922row5_col0\" class=\"data row5 col0\" >Feature # 5</td>\n",
       "                        <td id=\"T_4a9e5dd2_6144_11ea_9e82_784f43517922row5_col1\" class=\"data row5 col1\" >0.120289</td>\n",
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_4a9e5dd2_6144_11ea_9e82_784f43517922level0_row6\" class=\"row_heading level0 row6\" >6</th>\n",
       "                        <td id=\"T_4a9e5dd2_6144_11ea_9e82_784f43517922row6_col0\" class=\"data row6 col0\" >Feature # 6</td>\n",
       "                        <td id=\"T_4a9e5dd2_6144_11ea_9e82_784f43517922row6_col1\" class=\"data row6 col1\" >0.0643232</td>\n",
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_4a9e5dd2_6144_11ea_9e82_784f43517922level0_row7\" class=\"row_heading level0 row7\" >7</th>\n",
       "                        <td id=\"T_4a9e5dd2_6144_11ea_9e82_784f43517922row7_col0\" class=\"data row7 col0\" >Feature # 7</td>\n",
       "                        <td id=\"T_4a9e5dd2_6144_11ea_9e82_784f43517922row7_col1\" class=\"data row7 col1\" >0.286162</td>\n",
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_4a9e5dd2_6144_11ea_9e82_784f43517922level0_row8\" class=\"row_heading level0 row8\" >8</th>\n",
       "                        <td id=\"T_4a9e5dd2_6144_11ea_9e82_784f43517922row8_col0\" class=\"data row8 col0\" >Target # 0</td>\n",
       "                        <td id=\"T_4a9e5dd2_6144_11ea_9e82_784f43517922row8_col1\" class=\"data row8 col1\" >0.119635</td>\n",
       "            </tr>\n",
       "    </tbody></table>"
      ],
      "text/plain": [
       "<pandas.io.formats.style.Styler at 0x1a190e1278>"
      ]
     },
     "execution_count": 604,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.DataFrame(\n",
    "    zip(\n",
    "        clf.estimators_[-2].feature_importances_, \n",
    "        feature_names + target_names\n",
    "    ),\n",
    "    columns=['Coeff', 'Feature']\n",
    ")[\n",
    "    ['Feature', 'Coeff']\n",
    "].style.bar(\n",
    "    subset=['Coeff'], align='mid', color='#AAAAAA'\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 605,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style  type=\"text/css\" >\n",
       "    #T_4aa3bde8_6144_11ea_97ce_784f43517922row0_col1 {\n",
       "            width:  10em;\n",
       "             height:  80%;\n",
       "        }    #T_4aa3bde8_6144_11ea_97ce_784f43517922row1_col1 {\n",
       "            width:  10em;\n",
       "             height:  80%;\n",
       "        }    #T_4aa3bde8_6144_11ea_97ce_784f43517922row2_col1 {\n",
       "            width:  10em;\n",
       "             height:  80%;\n",
       "        }    #T_4aa3bde8_6144_11ea_97ce_784f43517922row3_col1 {\n",
       "            width:  10em;\n",
       "             height:  80%;\n",
       "        }    #T_4aa3bde8_6144_11ea_97ce_784f43517922row4_col1 {\n",
       "            width:  10em;\n",
       "             height:  80%;\n",
       "        }    #T_4aa3bde8_6144_11ea_97ce_784f43517922row5_col1 {\n",
       "            width:  10em;\n",
       "             height:  80%;\n",
       "        }    #T_4aa3bde8_6144_11ea_97ce_784f43517922row6_col1 {\n",
       "            width:  10em;\n",
       "             height:  80%;\n",
       "        }    #T_4aa3bde8_6144_11ea_97ce_784f43517922row7_col1 {\n",
       "            width:  10em;\n",
       "             height:  80%;\n",
       "        }    #T_4aa3bde8_6144_11ea_97ce_784f43517922row8_col1 {\n",
       "            width:  10em;\n",
       "             height:  80%;\n",
       "            background:  linear-gradient(90deg,#AAAAAA 100.0%, transparent 100.0%);\n",
       "        }    #T_4aa3bde8_6144_11ea_97ce_784f43517922row9_col1 {\n",
       "            width:  10em;\n",
       "             height:  80%;\n",
       "        }</style><table id=\"T_4aa3bde8_6144_11ea_97ce_784f43517922\" ><thead>    <tr>        <th class=\"blank level0\" ></th>        <th class=\"col_heading level0 col0\" >Feature</th>        <th class=\"col_heading level0 col1\" >Coeff</th>    </tr></thead><tbody>\n",
       "                <tr>\n",
       "                        <th id=\"T_4aa3bde8_6144_11ea_97ce_784f43517922level0_row0\" class=\"row_heading level0 row0\" >0</th>\n",
       "                        <td id=\"T_4aa3bde8_6144_11ea_97ce_784f43517922row0_col0\" class=\"data row0 col0\" >Feature # 0</td>\n",
       "                        <td id=\"T_4aa3bde8_6144_11ea_97ce_784f43517922row0_col1\" class=\"data row0 col1\" >0</td>\n",
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_4aa3bde8_6144_11ea_97ce_784f43517922level0_row1\" class=\"row_heading level0 row1\" >1</th>\n",
       "                        <td id=\"T_4aa3bde8_6144_11ea_97ce_784f43517922row1_col0\" class=\"data row1 col0\" >Feature # 1</td>\n",
       "                        <td id=\"T_4aa3bde8_6144_11ea_97ce_784f43517922row1_col1\" class=\"data row1 col1\" >0</td>\n",
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_4aa3bde8_6144_11ea_97ce_784f43517922level0_row2\" class=\"row_heading level0 row2\" >2</th>\n",
       "                        <td id=\"T_4aa3bde8_6144_11ea_97ce_784f43517922row2_col0\" class=\"data row2 col0\" >Feature # 2</td>\n",
       "                        <td id=\"T_4aa3bde8_6144_11ea_97ce_784f43517922row2_col1\" class=\"data row2 col1\" >0</td>\n",
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_4aa3bde8_6144_11ea_97ce_784f43517922level0_row3\" class=\"row_heading level0 row3\" >3</th>\n",
       "                        <td id=\"T_4aa3bde8_6144_11ea_97ce_784f43517922row3_col0\" class=\"data row3 col0\" >Feature # 3</td>\n",
       "                        <td id=\"T_4aa3bde8_6144_11ea_97ce_784f43517922row3_col1\" class=\"data row3 col1\" >0</td>\n",
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_4aa3bde8_6144_11ea_97ce_784f43517922level0_row4\" class=\"row_heading level0 row4\" >4</th>\n",
       "                        <td id=\"T_4aa3bde8_6144_11ea_97ce_784f43517922row4_col0\" class=\"data row4 col0\" >Feature # 4</td>\n",
       "                        <td id=\"T_4aa3bde8_6144_11ea_97ce_784f43517922row4_col1\" class=\"data row4 col1\" >0</td>\n",
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_4aa3bde8_6144_11ea_97ce_784f43517922level0_row5\" class=\"row_heading level0 row5\" >5</th>\n",
       "                        <td id=\"T_4aa3bde8_6144_11ea_97ce_784f43517922row5_col0\" class=\"data row5 col0\" >Feature # 5</td>\n",
       "                        <td id=\"T_4aa3bde8_6144_11ea_97ce_784f43517922row5_col1\" class=\"data row5 col1\" >0</td>\n",
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_4aa3bde8_6144_11ea_97ce_784f43517922level0_row6\" class=\"row_heading level0 row6\" >6</th>\n",
       "                        <td id=\"T_4aa3bde8_6144_11ea_97ce_784f43517922row6_col0\" class=\"data row6 col0\" >Feature # 6</td>\n",
       "                        <td id=\"T_4aa3bde8_6144_11ea_97ce_784f43517922row6_col1\" class=\"data row6 col1\" >0</td>\n",
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_4aa3bde8_6144_11ea_97ce_784f43517922level0_row7\" class=\"row_heading level0 row7\" >7</th>\n",
       "                        <td id=\"T_4aa3bde8_6144_11ea_97ce_784f43517922row7_col0\" class=\"data row7 col0\" >Feature # 7</td>\n",
       "                        <td id=\"T_4aa3bde8_6144_11ea_97ce_784f43517922row7_col1\" class=\"data row7 col1\" >0</td>\n",
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_4aa3bde8_6144_11ea_97ce_784f43517922level0_row8\" class=\"row_heading level0 row8\" >8</th>\n",
       "                        <td id=\"T_4aa3bde8_6144_11ea_97ce_784f43517922row8_col0\" class=\"data row8 col0\" >Target # 0</td>\n",
       "                        <td id=\"T_4aa3bde8_6144_11ea_97ce_784f43517922row8_col1\" class=\"data row8 col1\" >1</td>\n",
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_4aa3bde8_6144_11ea_97ce_784f43517922level0_row9\" class=\"row_heading level0 row9\" >9</th>\n",
       "                        <td id=\"T_4aa3bde8_6144_11ea_97ce_784f43517922row9_col0\" class=\"data row9 col0\" >Target # 1</td>\n",
       "                        <td id=\"T_4aa3bde8_6144_11ea_97ce_784f43517922row9_col1\" class=\"data row9 col1\" >0</td>\n",
       "            </tr>\n",
       "    </tbody></table>"
      ],
      "text/plain": [
       "<pandas.io.formats.style.Styler at 0x1a190e15c0>"
      ]
     },
     "execution_count": 605,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.DataFrame(\n",
    "    zip(\n",
    "        clf.estimators_[-1].feature_importances_, \n",
    "        feature_names + target_names\n",
    "    ),\n",
    "    columns=['Coeff', 'Feature']\n",
    ")[\n",
    "    ['Feature', 'Coeff']\n",
    "].style.bar(\n",
    "    subset=['Coeff'], align='mid', color='#AAAAAA'\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 606,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "F1-Score; MultiOutputClassifier=0.85, ClassifierChain=0.86\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import f1_score\n",
    "\n",
    "print(\n",
    "    'F1-Score; MultiOutputClassifier={:.2f}, ClassifierChain={:.2f}'.format(\n",
    "        f1_score(y_test, y_pred_multioutput, average='macro'),\n",
    "        f1_score(y_test, y_pred_chain, average='macro'),\n",
    "    )\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## One-Vs-The-Rest"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 569,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.datasets import make_classification\n",
    "\n",
    "x, y = make_classification(\n",
    "    n_samples=5000, n_features=15, n_informative=8, n_redundant=2, n_classes=4, class_sep=0.5, # 0.005,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 570,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((5000, 15), (5000,))"
      ]
     },
     "execution_count": 570,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x.shape, y.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 571,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 572,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.4432"
      ]
     },
     "execution_count": 572,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.multiclass import OneVsRestClassifier\n",
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "clf = OneVsRestClassifier(\n",
    "    estimator=LogisticRegression(solver='saga')\n",
    ")\n",
    "clf.fit(x_train, y_train)\n",
    "y_pred = clf.predict(x_test)\n",
    "\n",
    "accuracy_score(y_test, y_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 573,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.464"
      ]
     },
     "execution_count": 573,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.multiclass import OneVsOneClassifier\n",
    "\n",
    "clf = OneVsOneClassifier(\n",
    "    estimator=LogisticRegression(solver='saga')\n",
    ")\n",
    "clf.fit(x_train, y_train)\n",
    "y_pred = clf.predict(x_test)\n",
    "\n",
    "accuracy_score(y_test, y_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 578,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.3448"
      ]
     },
     "execution_count": 578,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.multiclass import OutputCodeClassifier\n",
    "\n",
    "clf = OutputCodeClassifier(\n",
    "    estimator=LogisticRegression(solver='saga'),\n",
    "    code_size=0.8\n",
    ")\n",
    "clf.fit(x_train, y_train)\n",
    "y_pred = clf.predict(x_test)\n",
    "\n",
    "accuracy_score(y_test, y_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 579,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.2816"
      ]
     },
     "execution_count": 579,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.multiclass import OutputCodeClassifier\n",
    "\n",
    "clf = OutputCodeClassifier(\n",
    "    estimator=LogisticRegression(solver='saga'),\n",
    "    code_size=0.6\n",
    ")\n",
    "clf.fit(x_train, y_train)\n",
    "y_pred = clf.predict(x_test)\n",
    "\n",
    "accuracy_score(y_test, y_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Calibration"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 699,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/tarek/anaconda3/envs/scikitbook/lib/python3.6/site-packages/ipykernel_launcher.py:18: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n"
     ]
    },
    {
     "data": {
      "image/png": "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li9fflD722+/fdDzE088kU8//ZTevXsf8pOZmQnA0qVLueGGGxg3bhwDBw4kPz+f0tLSFuW55JJLSElJ4Q9/+MNht9dNwHrrrbfIy8vjjjvuYNiwYfTt25dNmza16L3qrFix4qDny5cv57jjjmvyNW+++SYnnHACt9xyC0OGDKFPnz58+eWXB+2TnJzcbM9p7969SUlJYenSpYccv3///i34FCIiItEjIyOD6upq9u3bF5oEHE2ipad0NnCLmT0FnAyUt+frSQF+8IMf8Nvf/pbi4mKGDx/O3Llzef311w/a55e//CWXXnopt99+O1deeSVZWVl8/vnnvPDCC/z+978nLS2Nvn37MmvWLEaOHEltbS2//e1vWzycXVBQwO9//3t+8pOfUF5eznXXXUdRURE7d+5k7ty5LFmyhHnz5lFcXMz27dt5/PHHGT16NG+99RZTpkw5os8/Y8YMjj32WE488USefvppli9ffshEr4aKi4uZMWMGL730EgMGDODll19mzpw5B+3Ts2dPtm7dyvLly+nTpw9paWmH9Limp6fz3e9+l3vvvZdOnTpx/PHH8+KLLzJ37lxeeOGFI/o8IiIiXti1a1doQnJOTg4TJkygU6dOLZrn0VbapCg1syeBM4FOZvYVcBeQBOCc+wswFxgHrAUqgEMv2GxnJk2axI4dO7j99tvZv38/55xzDj/72c+48847Q/uMHj2a2bNnc9999zFu3Dj8fj/du3fnrLPOCq37+cADD3Drrbdy9tln07lzZ3784x8f0X3Xr732WoqLi7n//vu54YYb2L17N127dmXkyJGhYvH888/ntttu45577mHfvn2MGjWKu+++mxtvvLHF73fXXXcxbdo0brnlFvLz83nkkUcOud63oYkTJ7J69Wp+8IMfUFtby3nnnccvfvELfvazn4X2ueCCC7jkkku44oor2LVrFz//+c8Pe83wr371KxISEvjlL3/J9u3b6d27N4888ogmMImISMx4++23ef3117n44otDo411l/dFI4ule3CXl5c3GXbHjh0RuQ2nSGv59NNP+fDDD8nIyGDcuHFex4k50XTtkxw5ncf4oPMY/d555x1effVVRo0axejRow+7j1fnMScnxxq2RcvwvYiIiIgcBecce/bsCd2hcOjQoXTt2pWCggKPk4Un+i4oEBEREZEW2b9/P88++yyPP/546DI9M4uZghRUlIqIiIjEvOTkZCorK6murmb79u1exzkiGr4XERERiUEHDhzAzEhOTiYhIYGLLrqIhISE0PB9rFFPqYiIiEiM2bhxI1OmTGHhwoWhttzc3JgtSCEOi9JYWk1A2hfnHDU1NV7HEBGROJCYmMjevXvZvHkz1dXVXsdpFXE1fJ+dnc2GDRsoLCzE7JCVBkQ89fXXX/PVV18BROWixSIiEt0qKipCN3zJz8/nyiuvpFu3bvh8Po+TtY64KkqTkpLw+XysWrWK1NTUVilMa2pqSEyMq6+pXfL6PDrnKCsrY8+ePdTU1NChQwfPsoiISOxZvnw5ixcv5sorr6R79+4A9OjRw+NUrSvuqq1u3bqxY8cOli9fjs/nO+oeqZ07d6qAiAPRcB7rhu+7devG8OHDPc0iIiKxpaKigurqakpLS0NFabyJu6IU4IQTTqB79+5s27aN2traozrWV199Fbcnvz2JhvNoZnTo0IH8/HwN34uISJOcc+zfv5+0tDQATj/9dIqKiigqKvI2WATFZVEK0LFjRzp27HjUx0lOTtZt1OKAzqOIiMSKyspK5s2bx86dO7nuuutITEzE5/PFdUEKcTj7XkRERCSW+Xw+tm3bRnl5Odu2bfM6TpuJ255SERERkVhRVVVFYmIiCQkJJCcnM378eFJSUsjNzfU6WptRT6mIiIiIhzZt2sRjjz3GsmXLQm35+fntqiAFFaUiIiIinjpw4AA7d+7ks88+w+/3ex3HMxq+FxEREWljVVVVJCcnA9CrVy++9a1v0bt373a9Okv7/eQiIiIibcw5x8qVK3nooYcoKysLtR977LHt/mY9KkpFRERE2oiZsWnTJioqKlizZo3XcaJK+y7JRURERNpAdXU1SUlJAJx77rn0799f62c3oJ5SERERkQiprKzkxRdf5Nlnn8U5B0BqaqoK0sNQT6mIiIhIhNTW1lJaWkpNTQ3bt2+nc+fOXkeKWipKRURERFpRTU0NPp8PMyMzM5OLL76YnJwcOnTo4HW0qKbhexEREZFWsnnzZh577DE++uijUFtRUZEK0jCoKBURERFpJV9//TU7duzgvffeC11DKuHR8L2IiIjIUaitrcXn8wEwaNAg/H4/AwcOxMw8ThZb1FMqIiIicgScc7z33ns88sgj7Nu3DwisQzpkyJDQ8k8SPhWlIiIiIkfok08+YdeuXaxevdrrKDFPw/ciIiIiLeD3+0lISMDMuOCCC9i0aRP9+/f3OlbMU1EqIiIiEob9+/czf/58AL75zW8CkJOTQ05Ojpex4oaG70VERETCsG/fPj799NPQkL20LvWUioiIiDSibqgeIC8vj29+85t07tyZ3Nxcj5PFH/WUioiIiBzG1q1bmTp1KqWlpaG24447jry8PO9CxTEVpSIiIiKHsXbtWrZt28bSpUu9jtIuaPheREREJMg5F1r0/pRTTsHn8zF06FCPU7UP6ikVERGRds85x/vvv8/06dOpqqoCICEhgZEjR5KcnOxxuvZBRamIiIi0e36/nxUrVrB582YthO8RDd+LiIhIu1U3XO/z+bjwwgvZtm0bxx9/vNex2iUVpSIiItLuVFVVsWDBAtLT0znjjDMAyM/PJz8/3+Nk7ZeG70VERKTd2bZtG++//z4rVqxg7969XscR1FMqIiIi7UT9mfXdu3fn3HPPpbCwkMzMTI+TCainVERERNqB7du387e//Y1t27aF2oYOHUrnzp09TCX1qSgVERGRuPfuu++yceNGFi9e7HUUaYSG70VERCTunXnmmSQnJ3PKKad4HUUaoZ5SERERiSvOOT766COeeeYZ/H4/AMnJyZx55pmkpKR4nE4ao6JURERE4kp1dTULFy7k888/59NPP/U6joRJw/ciIiISV5KTk7nwwgvZtWsX/fv39zqOhElFqYiIiMS0up7RTp06MXToUACKioq8DSUtpqJUREREYlppaSnvvPMOqampDBw4UNeNxigVpSIiIhLTiouLGTVqFMcee6wK0himiU4iIiISU8rKynj66acpLy8PtY0ePZouXbp4mEqOlopSERERiSmLFy9m3bp1LFq0yOso0oo0fC8iIiIx5ZxzziE1NZUzzzzT6yjSitRTKiIiIlHt008/Zd68eTjnAMjMzOT8888nNTXV42TSmtRTKiIiIlGroqKCuXPncuDAAfr160fv3r29jiQRoqJUREREolZ6ejrnnnsuVVVV9OrVy+s4EkEqSkVERCRq1NTUsHjxYrp3786xxx4LwPHHH+9xKmkLuqZUREREosbHH3/M22+/zSuvvEJNTY3XcaQNqadUREREosYJJ5zApk2bGDx4MImJKlPaE/WUioiIiGd27drFiy++yP79+wEwM8aOHUtBQYHHyaStqSgV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\n",
      "text/plain": [
       "<Figure size 720x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.calibration import calibration_curve\n",
    "\n",
    "fig, ax = plt.subplots(1, 1, figsize=(10, 8))\n",
    "\n",
    "ax.plot(\n",
    "    [0, 1], [0, 1], \n",
    "    linestyle=':', \n",
    "    lw=2, color='k',\n",
    "    label='Ideal Calibration', alpha=0.5\n",
    ")\n",
    "\n",
    "ax.set_title('Probability Calibration Curve')\n",
    "ax.set_xlabel('Predicted Probability')\n",
    "ax.set_ylabel('% of samples in Class 1')\n",
    "\n",
    "ax.legend(loc=\"upper left\", fontsize='x-large', shadow=True)\n",
    "\n",
    "fig.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 700,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((50000, 15), (50000,))"
      ]
     },
     "execution_count": 700,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.datasets import make_classification\n",
    "\n",
    "x, y = make_classification(\n",
    "    n_samples=50000, n_features=15, n_informative=5, n_redundant=10, n_classes=2, class_sep=0.001\n",
    ")\n",
    "\n",
    "x.shape, y.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 701,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 702,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.naive_bayes import GaussianNB\n",
    "\n",
    "clf = GaussianNB()\n",
    "clf.fit(x_train, y_train)\n",
    "y_pred = clf.predict(x_test)\n",
    "y_pred_proba = clf.predict_proba(x_test)[:,-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 703,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/tarek/anaconda3/envs/scikitbook/lib/python3.6/site-packages/ipykernel_launcher.py:26: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n"
     ]
    },
    {
     "data": {
      "image/png": "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mCeffNLZdvDgwauKe9OmTdSrVw9wzDjfsmUL999//xXfs2bNGrp06cJDDz3kbNu7d2+6Pj4+PhkSqWbNmnH27Fni4uIyjLamqlevHtOnTyc6Otr5Q2DXrl2Z/kKQ1n333ccjjzzC//73P+66665rjr9ixYps2rQpXVtmNdCVK1emb9++9O3bl27dujFgwADeffdd/P39McbQokULWrRowfDhw7nrrruYNWuWsxwjrXXr1lG+fPl0ZRnz58+/4ufIiZCQEAYPHsyYMWOyLbFI5enpSWxs7DUfW0TE3cTExBAdHe0cDGnUqBH16tXLt4zx1w8AACAASURBVJVg3I1GWguJAQMGOGf8b9++nf379zN37lzGjh1Lnz59cvVb2N133021atV44IEHWLFiBVFRUaxcuZKvvvoKcBR679y5k4ULF7J//34mTZrEN998c1Vxv//++yxdupTIyEieffZZTp06xYABA674nvDwcFavXs1PP/3EH3/8wd///ne2bNmSrk9oaCi///47u3bt4tSpU1y6dImOHTvSuXNnHnroIb799luioqLYvn07kydPZvr06c7PXrp0aR5//HF27NjBpk2bePLJJylZsuQVY+rduzcPPPAAgwcP5vXXX2fdunUcPHiQbdu2MXHiROD/F3POSfydO3fm999/58MPP2T//v1Mnz6defPmpevz/PPPs3TpUvbv38+uXbv45ptvCAkJoUyZMmzYsIF//OMfbN68mT///JOVK1fy22+/ZVnXGh4ezsmTJ5kxYwZRUVF8/vnnTJs27YqfOaeeeeYZ4uLiMv0eSUpK4tixYxw7doyoqCg+/vhjfvjhB2655ZY8ObaIiLs4ffo006ZN4+uvv+b8+fOAY7RVCWvOKWktJKpXr86SJUuIjo7m/vvvJyIign/+85889dRTvPfee7naV6lSpVi4cCH169fn0UcfpU2bNjz33HPO0a/+/ftz33338cQTT9CxY0e2bNnCSy+9dFVxjxkzhrFjx9KhQwc2bNjAZ599lu0DCJ5//nkiIiLo06cPXbt2dS4hldZDDz1E8+bN6d69O7Vq1WLu3LkYY/j888+59dZbefnll2nVqhX33nsvS5cudU40K1WqFLNnz+b06dN06dKFgQMHMmTIECpUqJDtZ5k0aRLjx49n06ZN3HfffTRv3pz777+fAwcO8OWXXzpHGnMS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IiIiBSghIYGVK1cSGhpKeHg4AI0aNXJxVJJTS5cu5V//+le6thtvvJHhw4e7KKLiQ+UBIiIiBei3335j06ZNLFmyhMTERFeHI7lw6NAh/va3v6VrCw4OZsqUKXh4KKXKbxppFRERKUBNmjTh6NGjNG3aFC8v/TdcVCQkJDBgwABOnz7tbPPw8GDatGlUqFDBhZEVH/q1QEREJB+dOXOGefPmERcXB4Axhh49ehAcHOziyCQ3xowZw4YNG9K1jRw5kvbt27soouJHSauIiEg+WrRoEbt27WL16tWuDkWu0nfffce///3vdG1du3blmWeecVFExZOSVhERkXx08803c9111xEREeHqUOQq/PnnnxnqWKtWrcp///tf1bEWMJ1tERGRPBQZGcmqVaucr8uXL88tt9xCyZIlXRiVXI2kpCQeffRRoqOjnW2enp5MmzaN8uXLuzCy4klJq4iISB6Jjo5m3rx5rF69miNHjrg6HLlGnp6e9O/fP90vHKNGjaJt27YujKr40rRFERGRPBIYGEinTp3w8vLSRCs38eCDD9KsWTP69etHWFgYQ4cOdXVIxZaSVhERkauUmJjIqlWrqFu3LlWqVAHQKJwbql+/Pj/++CMJCQmqY3UhnXkREZGrtHnzZtavX8/ChQtJTk52dTiSj/z8/AgMDHR1GMWaRlpFRESuUsuWLTl8+DBt2rTRCJxIPtO/MBERkRyKjo5myZIlJCUlAeDl5cVdd91FSEiIiyOTvPDNN9/wt7/9jQsXLrg6FMmERlpFRERywFrLV199xbFjxyhdurTWXXUzUVFRPPHEE8TExLBt2zY++eQT6tev7+qwJA2NtIqIiOSAMYauXbtSr149mjVr5upwJA9dunSJ/v37ExMTAzjW2u3evXu69VnF9TTSKiIikoU//viDc+fOOZPUatWqUa1aNRdHJXnt1VdfZdu2benaXnrpJU28KmSUtIqIiGTixIkTzJkzB09PT6pXr64nILmh+Ph43n33XaZMmZKuvVevXgwePNhFUUlWrilpNcZUt9YezKtgRERECouKFSvSsmVL/P39KVu2rKvDkTy2adMmnnrqKXbt2pWuvXr16kyYMAFjjIsik6xcddJqjCkB7Ac88y4cERER10hKSmLt2rU0atTImaR27drVxVFJXjt//jxjxoxhypQpWGvTbfP29uaTTz5RWUAh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\n",
      "text/plain": [
       "<Figure size 720x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.calibration import calibration_curve\n",
    "\n",
    "fraction_of_positives, mean_predicted_value = calibration_curve(y_test, y_pred_proba, n_bins=10)\n",
    "\n",
    "fig, ax = plt.subplots(1, 1, figsize=(10, 8))\n",
    "\n",
    "ax.plot(\n",
    "    [0, 1], [0, 1], \n",
    "    linestyle=':', \n",
    "    lw=2, color='k',\n",
    "    label='Ideal Calibration', alpha=0.5\n",
    ")\n",
    "\n",
    "ax.plot(\n",
    "    mean_predicted_value, fraction_of_positives, \"--\", label='Uncalibrated GaussianNB', color='k'\n",
    ")\n",
    "\n",
    "ax.set_title('Probability Calibration Curve')\n",
    "ax.set_xlabel('Predicted Probability')\n",
    "ax.set_ylabel('% of samples in Class 1')\n",
    "ax.set_xlim((0,1))\n",
    "ax.set_ylim((0,1))\n",
    "\n",
    "ax.legend(loc=\"upper left\", fontsize='x-large', shadow=True)\n",
    "\n",
    "fig.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 704,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.calibration import CalibratedClassifierCV\n",
    "from sklearn.naive_bayes import GaussianNB\n",
    "\n",
    "clf_calib = CalibratedClassifierCV(GaussianNB(), cv=3, method='isotonic')\n",
    "clf_calib.fit(x_train, y_train)\n",
    "y_pred_calib = clf_calib.predict(x_test)\n",
    "y_pred_proba_calib = clf_calib.predict_proba(x_test)[:,-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 705,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/tarek/anaconda3/envs/scikitbook/lib/python3.6/site-packages/ipykernel_launcher.py:30: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n"
     ]
    },
    {
     "data": {
      "image/png": "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XrduXeLj42nfvv05L9m7XC5++ukn2rdvj8PhwOl00rNnT4wx7Nq1i7feeosvv/zS73m9evXiscce8y0rJSIi5y/YUPocMN4Y86K19vA5e4uIFLDDhw8zefJkPvvsM79RS8iclPTQQw9x5513Eh5+7n/qrLXMnz+fvXv3EhYW5tsGdNOmTcyaNYslS5b4vU5YWBhDhgzhH//4R/68KRGRUizYULoFGAH8M9tIgwGstVaL74lIoVu8eDELFy70aw8LC6Nbt248+OCDVKhQIejzGWPo2LEjS5cupVmzZqxYsYJ333031xHYmJgYRo8erRn2IiL5JNhQOgeYDXxIzolOIiIh0a1bN+bPn8+uXbt8bddddx3x8fE0aNAgqHPs37+fo0ePcvnllwNQp04d4uLi6N+/P1u3bs31efXq1ePVV189r/tTRUQkb8GG0srAcBvoGpmISAg4nU6eeOIJBg4cSIMGDXjiiSd8l9yDcfToUWbPno3D4aBChQosX76cuXPnsn///lyf06RJE/r06cNNN92kHZpERPJZsKF0JtCLzNFSEZFCcfDgQebMmUP//v2JjIz0O96hQwfGjBnD9ddfH9R9o9lVqlSJBg0asHr1anr37s2JEydy7duqVSvuu+8+2rZtG9T6piIicv6C/Ve8DfCoMeYZ4I/sB6y1HfO9KhEp1VwuF/PmzePdd98lNTWVihUrcv/99/v1M8Zw4403BnVOay3r16+nfv36vvP/+9//JjU1NWB/YwydO3emT58+vsv7IiJScIINpdPP/BIRKTDWWr766ismTZrEH3/83/ffGTNm0LVr14s698qVK/nkk09ISkpiz549eDyegP0iIiL461//Sq9evahbV3uDiIgUlqBCqbV2VkEXIiKl24YNGxg/fjwbNmzwO5aamspHH33ETTfddN7ntdaydu1a5s2bx1dffUV0dHTA3ZzKli3LHXfcwb333qsdmUREQiDom7CMMdXIvIwfR+ZyUABYa2cUQF0iUkocOHCAN954I+Ci9AAVKlTg4Ycf5u9//ztJSUlBn9flcjF79mxWrVrlC7qBloiKi4vj3nvv5R//+Adly5a9sDchIiIXLahQaoy5HZgLbAUuBzYCzYHlgEKpiJy3rNA4e/Zsvz3kAcLDw7nnnnu4//77KVeuXNDnTU9P54svvuCVV17h0KFDxMTEUKZMGb9+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\n",
      "text/plain": [
       "<Figure size 720x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.calibration import calibration_curve\n",
    "\n",
    "fig, ax = plt.subplots(1, 1, figsize=(10, 8))\n",
    "\n",
    "ax.plot(\n",
    "    [0, 1], [0, 1], \n",
    "    linestyle=':', \n",
    "    lw=2, color='k',\n",
    "    label='Ideal Calibration', alpha=0.5\n",
    ")\n",
    "\n",
    "fraction_of_positives, mean_predicted_value = calibration_curve(y_test, y_pred_proba, n_bins=10)\n",
    "\n",
    "ax.plot(\n",
    "    mean_predicted_value, fraction_of_positives, \"--\", label='Uncalibrated GaussianNB', color='k', alpha=0.85\n",
    ")\n",
    "\n",
    "fraction_of_positives, mean_predicted_value = calibration_curve(y_test, y_pred_proba_calib, n_bins=10)\n",
    "\n",
    "ax.plot(\n",
    "    mean_predicted_value, fraction_of_positives, \"-\", label='Calibrated GaussianNB', color='k', alpha=0.85\n",
    ")\n",
    "\n",
    "ax.set_title('Probability Calibration Curve')\n",
    "ax.set_xlabel('Predicted Probability')\n",
    "ax.set_ylabel('% of samples in Class 1')\n",
    "\n",
    "ax.legend(loc=\"upper left\", fontsize='x-large', shadow=True)\n",
    "\n",
    "fig.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Precision @ k"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 711,
   "metadata": {},
   "outputs": [],
   "source": [
    "def precision_at_k_score(y_true, y_pred_proba, k=1000, pos_label=1):\n",
    "    topk = [\n",
    "        y_true_ == pos_label \n",
    "        for y_true_, y_pred_proba_ \n",
    "        in sorted(\n",
    "            zip(y_true, y_pred_proba), \n",
    "            key=lambda y: y[1], \n",
    "            reverse=True\n",
    "        )[:k]\n",
    "    ]\n",
    "    return sum(topk) / len(topk)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 713,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.82"
      ]
     },
     "execution_count": 713,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "precision_at_k_score(y_test, y_pred_proba, k=500)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 715,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "precision @ k=1,000: 78.10%\n",
      "precision @ k=1,500: 76.20%\n",
      "precision @ k=3,000: 71.70%\n",
      "precision @ k=6,000: 65.60%\n"
     ]
    }
   ],
   "source": [
    "for k in 1000, 1500, 3000, 6000:\n",
    "    print(\n",
    "        'precision @ k={:,}: {:.2%}'.format(\n",
    "            k, precision_at_k_score(y_test, y_pred_proba, k=k)\n",
    "        )\n",
    "    )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 717,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.621587462082912"
      ]
     },
     "execution_count": 717,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import precision_score\n",
    "\n",
    "precision_score(y_test, y_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
